Skip to content

feat(org-lens): org lens project detail page UI#1028

Merged
danoqualls merged 91 commits into
mainfrom
feat/LFXV2-1885
Jul 6, 2026
Merged

feat(org-lens): org lens project detail page UI#1028
danoqualls merged 91 commits into
mainfrom
feat/LFXV2-1885

Conversation

@danoqualls

@danoqualls danoqualls commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

Business case: company can view their involvement in a project in a detailed way that adds up to influence in the project and compares influence to other companies. UI only with demo data. Includes both influence detail tab and leaderboards tab.

This pull request introduces the Org Lens Project Detail sub-page (LFXV2-1885) to the application, enabling users to view detailed analytics and leaderboard data for individual projects within an organization. It includes the new route and navigation entry, a complete UI with tabbed navigation, metric and time range toggles, demo data integration, and comprehensive E2E tests. Additionally, it restores interactivity for project rows in the Org Overview, allowing users to drill down into project details.

Org Lens Project Detail Feature Implementation:

  • Added the /org/projects/:projectSlug route, navigation entry, and associated metadata, enabling direct navigation to project detail pages. [1] [2]
  • Implemented the OrgProjectDetailService to provide demo data for the project detail page, designed for easy replacement with a real backend API in the future.
  • Created the OrgProjectDetailTabBarComponent for tabbed navigation, including keyboard accessibility, metric toggles, and time range selection. [1] [2]
  • Added comprehensive Playwright E2E tests covering rendering, tab navigation, leaderboard interactions, URL parameter persistence, and 404 handling for unknown slugs.

Org Overview Interactivity Restoration:

  • Restored click and keyboard handlers to project rows in the Org Overview, allowing users to navigate to the new project detail page and emitting telemetry events. [1] [2] [3]

Supporting and Miscellaneous Updates:

  • Exported new interfaces for the Org Lens Project Detail feature in the shared package.
  • Minor improvement to the Valkey cache service for more robust JSON retrieval.

Summary

  • Adds the Org Lens Project Detail sub-page at /org/projects/:projectSlug, opened from the Overview's Foundations & Projects table
  • Backed by a TypeScript demo-data service (org-lens-project-detail.demo-data.ts) via a new service + controller + route — demo company data only; real Snowflake integration is a separate story. Note: there is no static JSON fixture; all demo payloads are generated server-side in TypeScript.
  • Two tabs — Our Influence (default) and Leaderboards — with tab/metric/range state persisted as query params (?tab=, ?metric=, ?range=)

Our Influence tab:

  • Hero block (logo, name, description, LFX Insights link, First commit, Software value, Health badge, Foundation pill)
  • Technical Influence section (Maintainers, Contributors, Commit Activities, Pull Requests, Avg Merge Time) — horizontal carousel with scrolling chevrons; each card opens a detail drawer
  • Ecosystem Influence section (Collaboration Activity, Meeting Attendance, Board Members, Committee Members, Event Attendance, Event Speakers, Event Sponsorships, Meetup Attendance, Certified Individuals)
  • Per-card influence chart (area / bar / line variants with custom external tooltip)
  • Card detail drawer: definition table + card-specific data table

Leaderboards tab:

  • Side-by-side Technical / Ecosystem leaderboard tables with search, PrimeNG paginator, viewing-org row highlighted, band tags (Leading / Contributing / Participating / Non-LF)
  • Metric toggle (Calculated Influence / Activity Count) + time range pill group (1y / 2y / All time) in the shared tab bar
  • Stacked 100% area trend chart showing top-10 companies' share over time with deterministic demo trajectories

Shell:

  • Page-state machine (loading / error / notFound / ready) with <p-skeleton> loading states and lfx-empty-state error/not-found panels
  • Breadcrumb: Projects → <project name>
  • All sections use data-testid attributes; E2E coverage added

PR size rationale

This PR is ~2,500 lines. The branch builds the complete Project Detail page end-to-end (scaffold → hero → influence cards → trend chart → leaderboards → e2e → polish). The intermediate commits are not independently shippable — routing and the data layer land without visible UI until the component is complete. Splitting at a natural seam (e.g., scaffold-only or data-layer-only) would merge dead routes that don't render. The full page is the atomic unit of work here, consistent with how the sibling Membership Detail page (PR #921) was delivered.

Test plan

  • Start dev server with org lens flag enabled; open /org/overview, expand a foundation, click an LF project row → lands on /org/projects/<slug>
  • Hero renders all tiles (name, description, LFX Insights link, First commit, Software value, Health badge, Foundation)
  • Tab switch updates ?tab= and survives page reload
  • Technical + Ecosystem cards render counts, trendlines; clicking a card opens the detail drawer with definition + data table
  • Influence Trend stacked area chart renders with correct ordering (most influential at bottom); time range pills update the dataset window
  • Leaderboard tables rank orgs, pin the viewing-org row (highlighted), paginator works
  • Metric toggle switches between Calculated Influence (band tag) and Activity Count (numeric)
  • Time range pills update ?range= query param and persist on reload
  • Unknown slug shows the not-found panel; Back to Projects navigates to /org/projects
  • Playwright E2E suite passes: yarn e2e

🤖 Generated with Claude Code

@danoqualls danoqualls requested a review from a team as a code owner June 24, 2026 21:21
Copilot AI review requested due to automatic review settings June 24, 2026 21:21
@coderabbitai

coderabbitai Bot commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

Adds an Org Lens project-detail route, API, demo payloads, page rendering logic, and E2E coverage, plus a Valkey JSON cache miss handling tweak.

Changes

Org Project Detail

Layer / File(s) Summary
Route entry points
apps/lfx-one/src/app/app.routes.ts, apps/lfx-one/src/app/modules/dashboards/org/components/org-overview-foundations-and-projects/*
Adds the project-detail route and makes LF project rows navigate to that deep link on click and keyboard activation.
Shared contracts and API wiring
packages/shared/src/constants/*, packages/shared/src/interfaces/*, apps/lfx-one/src/app/shared/services/org-lens-project-detail.service.ts, apps/lfx-one/src/server/services/org-lens-project-detail.service.ts, apps/lfx-one/src/server/controllers/org-lens-project-detail.controller.ts, apps/lfx-one/src/server/routes/orgs.route.ts
Adds the project-detail constants and payload types, the client fetch wrapper, and the server controller/service route that returns JSON or 404 for the project detail API.
Demo payload generation
apps/lfx-one/src/server/services/org-lens-project-detail.demo-data.ts
Builds deterministic demo project detail responses with seeded cards, leaderboard rows, trend points, and drawer sections for known slugs.
Page logic and chart transforms
apps/lfx-one/src/app/modules/dashboards/org/org-project-detail/org-project-detail.component.ts
Derives tab and query-param state, fetch state, leaderboard filters, chart view models, and stacked trend data for the project-detail page.
Templates and tab bar
apps/lfx-one/src/app/modules/dashboards/org/org-project-detail/org-project-detail-tab-bar.*, apps/lfx-one/src/app/modules/dashboards/org/org-project-detail/org-project-detail.component.html
Renders the project-detail tab bar, page states, hero, influence tracks, leaderboards, trend chart, and drawer content.
E2E coverage
apps/lfx-one/e2e/org-project-detail.spec.ts
Adds Playwright coverage for page rendering, tab and metric URL behavior, leaderboard search, and the not-found state.

Valkey typing

Layer / File(s) Summary
Typed cache miss handling
apps/lfx-one/src/server/services/valkey.service.ts
Changes getJson to cast the raw Valkey value to `string

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • linuxfoundation/lfx-self-serve#753: Also changes the org route subtree in apps/lfx-one/src/app/app.routes.ts, which is directly related to the new project-detail deep link.
  • linuxfoundation/lfx-self-serve#754: Also changes the org-lens server routing layer in apps/lfx-one/src/server/routes/orgs.route.ts, which is directly related to the new project-detail API route.
  • linuxfoundation/lfx-self-serve#756: Also adds Org Lens project row navigation in apps/lfx-one/src/app/modules/dashboards/org/components/org-overview-foundations-and-projects/*, which is part of the same entry path into the new page.

Suggested labels

org-lens, enhancement

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 38.89% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title accurately summarizes the main change: adding the Org Lens project detail page UI.
Description check ✅ Passed The description clearly matches the changeset by describing the new project detail page, tabs, demo data, route updates, and E2E coverage.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/LFXV2-1885

Comment @coderabbitai help to get the list of available commands.

@github-actions

Copy link
Copy Markdown

🚀 Deployment Status

Your branch has been deployed to: https://ui-pr-1028.dev.v2.cluster.linuxfound.info

Deployment Details:

  • Environment: Development
  • Namespace: ui-pr-1028
  • ArgoCD App: ui-pr-1028

The deployment will be automatically removed when this PR is closed.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds the Org Lens Project Detail page under /org/projects/:projectSlug, introducing shared payload contracts plus a frontend demo-data seam and new UI (tabs, charts, drawer details) with query-param state. The PR also wires a new org route and updates navigation/telemetry touchpoints, and adds Playwright coverage.

Changes:

  • Add shared OrgLensProjectDetailResponse contracts and export them from @lfx-one/shared/interfaces.
  • Implement the Org Project Detail page UI (tabs, influence cards, leaderboards, stacked trend chart, card-detail drawer) backed by demo fixtures and a new Angular service.
  • Add org routing + E2E tests; minor Valkey cache read typing tweak.

Reviewed changes

Copilot reviewed 13 out of 13 changed files in this pull request and generated 8 comments.

Show a summary per file
File Description
packages/shared/src/interfaces/org-lens-project-detail.interface.ts Adds shared API contracts for Org Lens Project Detail payloads.
packages/shared/src/interfaces/index.ts Re-exports the new Project Detail interfaces from the interfaces barrel.
apps/lfx-one/src/server/services/valkey.service.ts Tightens getJson typing for Valkey reads and null handling.
apps/lfx-one/src/app/shared/services/org-lens-project-detail.service.ts Adds a frontend service seam for loading project detail (currently demo-backed).
apps/lfx-one/src/app/shared/services/org-lens-project-detail.demo-data.ts Adds large deterministic demo fixture generator for the project detail page.
apps/lfx-one/src/app/modules/dashboards/org/org-project-detail/org-project-detail.component.ts Implements page state machine, query-param persistence, leaderboard ranking, and chart dataset construction.
apps/lfx-one/src/app/modules/dashboards/org/org-project-detail/org-project-detail.component.html Implements page shell, hero, tabs, influence cards, leaderboards, trend chart, and drawer markup with testids.
apps/lfx-one/src/app/modules/dashboards/org/org-project-detail/org-project-detail-tab-bar.component.ts Adds the shared tab/metric/range control bar with keyboard navigation.
apps/lfx-one/src/app/modules/dashboards/org/org-project-detail/org-project-detail-tab-bar.component.html Tab bar template (tablist + metric toggle + time-range pills).
apps/lfx-one/src/app/modules/dashboards/org/components/org-overview-foundations-and-projects/org-overview-foundations-and-projects.component.ts Adds telemetry + navigation handlers intended to open project detail from overview rows.
apps/lfx-one/src/app/layouts/main-layout/main-layout.component.ts Re-enables “Projects” entry in Org Lens sidebar section.
apps/lfx-one/src/app/app.routes.ts Adds the /org/projects/:projectSlug route entry.
apps/lfx-one/e2e/org-project-detail.spec.ts Adds Playwright E2E coverage for project detail page behaviors and URL persistence.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread apps/lfx-one/src/app/layouts/main-layout/main-layout.component.ts Outdated
Comment thread apps/lfx-one/src/app/app.routes.ts
Comment thread apps/lfx-one/e2e/org-project-detail.spec.ts
Comment thread apps/lfx-one/e2e/org-project-detail.spec.ts
Comment thread apps/lfx-one/e2e/org-project-detail.spec.ts
@danoqualls danoqualls changed the title feat(org-lens): org lens project detail page (LFXV2-1885) feat(org-lens): org lens project detail page UI (LFXV2-1885) Jun 25, 2026
Copilot AI review requested due to automatic review settings June 25, 2026 03:03

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 13 out of 13 changed files in this pull request and generated 5 comments.

Comment thread apps/lfx-one/e2e/org-project-detail.spec.ts
Comment thread apps/lfx-one/e2e/org-project-detail.spec.ts
Comment thread apps/lfx-one/e2e/org-project-detail.spec.ts
Copilot AI review requested due to automatic review settings June 25, 2026 03:08
@danoqualls danoqualls removed the request for review from Copilot June 25, 2026 03:08
Copilot AI review requested due to automatic review settings June 25, 2026 03:20
@danoqualls danoqualls removed the request for review from Copilot June 25, 2026 03:20
danoqualls added a commit that referenced this pull request Jun 25, 2026
Address review comments from copilot-pull-request-reviewer,
copilot-swe-agent:

- org-project-detail.component.ts: make scoreColumnLabel dynamic using
  TIME_RANGE_MONTHS[timeRange()] so Activity column shows correct period
  for 2y/all ranges, not hard-coded (12mo) (per copilot-pull-request-reviewer)
- org-project-detail.component.ts: fix All others stacked trend to use
  the SUM of scores, not average — average understates the aggregate
  (per copilot-swe-agent)
- org-overview-foundations-and-projects.component.html: restore project
  row click/keydown handlers now that the detail drilldown page is built;
  remove the deferred-until-ready comment (per copilot-pull-request-reviewer)
- org-lens-project-detail.service.ts: remove Generated-with comment
  (per copilot-pull-request-reviewer)
- e2e/org-project-detail.spec.ts: move project-detail-trend-group
  assertion to the leaderboards test where it is actually rendered
  (per copilot-swe-agent)
- e2e/org-project-detail.spec.ts: remove stale ?score=/ from JSDoc —
  only ?metric= is used (per copilot-swe-agent)

Resolves 5 review threads; 2 threads addressed via responses only
(breadcrumb/CTA route and SSR endpoint are intentional by design).

Signed-off-by: daniel qualls <dqualls@linuxfoundation.org>
Copilot AI review requested due to automatic review settings June 25, 2026 13:03

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 16 out of 16 changed files in this pull request and generated 4 comments.

@danoqualls

Copy link
Copy Markdown
Contributor Author

Review Feedback Addressed

Commits: 7e6218f, 8373620

Changes Made

  • org-project-detail.component.html / app.routes.ts: not-found CTA and breadcrumb home now route to `/org/overview` — the `/org/projects` list page is being delivered in LFXV2-1883 / PR feat(org-lens): add projects page UI #921 (per copilot-pull-request-reviewer)
  • org-overview-foundations-and-projects.component.html: project row click/keydown handlers wired; deferred comment removed now that the detail page is built (per copilot-pull-request-reviewer)
  • org-lens-project-detail.service.ts / orgs.route.ts: service migrated from demo-data shim to `HttpClient` calling `GET /api/orgs/:orgUid/lens/projects/:projectSlug`; SSR controller and route registered (per copilot-pull-request-reviewer)
  • org-project-detail.component.ts: `scoreColumnLabel` is now computed dynamically — `Activity (12mo)`, `Activity (24mo)`, or `Activity (36mo)` based on the active time range (per copilot-pull-request-reviewer)
  • org-project-detail.component.ts: `buildStackedTrend()` All others now uses sum of remaining scores instead of average (per copilot-swe-agent)
  • e2e/org-project-detail.spec.ts: `project-detail-trend-group` assertion moved — now asserts after navigating to Leaderboards tab (where the section is rendered); also added to the leaderboards describe block (per copilot-swe-agent)
  • e2e/org-project-detail.spec.ts: removed stale `?score=/` from JSDoc — only `?metric=` is used (per copilot-swe-agent)

Threads Resolved

7 of 7 unresolved threads addressed in this iteration.

Copilot AI review requested due to automatic review settings June 25, 2026 13:17
danoqualls and others added 4 commits July 2, 2026 14:34
Address review comment from copilot-pull-request-reviewer:

- org-lens-project-detail.demo-data.ts: use Object.hasOwn(SEEDS, projectSlug)
  before indexing SEEDS, so keys inherited from Object.prototype (constructor,
  toString, valueOf, etc.) correctly fall through to the not-found path
  instead of returning a truthy prototype value.

Resolves 1 review thread.

Signed-off-by: daniel qualls <dqualls@linuxfoundation.org>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 18 out of 18 changed files in this pull request and generated 3 comments.

Address review comments from copilot-pull-request-reviewer:

- org-project-detail.component.ts: breadcrumb root now labeled "Projects"
  and links to /org/projects instead of /org/overview
- org-project-detail.component.html: not-found CTA and breadcrumb home
  routerLink now point to /org/projects instead of /org/overview

Matches the page's location as a sub-page of /org/projects/:projectSlug.

Resolves 3 review threads.

Signed-off-by: daniel qualls <dqualls@linuxfoundation.org>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 18 out of 18 changed files in this pull request and generated 4 comments.

Comment thread packages/shared/src/constants/org-lens-project-detail.constants.ts Outdated
Comment thread apps/lfx-one/src/server/services/org-lens-project-detail.demo-data.ts Outdated

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 18 out of 18 changed files in this pull request and generated 1 comment.

Address review comments from copilot-pull-request-reviewer:

- org-lens-project-detail.constants.ts: prefix DEFAULT_METRIC, VALID_METRICS,
  DEFAULT_TIME_RANGE, VALID_TIME_RANGES, HEALTH_TAG, BAND_TAG, METRIC_OPTIONS,
  TIME_RANGE_OPTIONS, TIME_RANGE_MONTHS, STACKED_PALETTE with PD_ so the
  shared barrel export can't collide with an identically-named constant from
  another feature
- org-lens-project-detail.interface.ts, org-lens-project-detail.demo-data.ts:
  drop hero.sourceUrl, hero.sourceLabel, hero.lastUpdated, and the unused
  `trend` payload (OrgLensProjectTrendPoint + trendSeries()/trailing12Months()
  generators) — none are read by the component, which builds its trend chart
  from `leaderboard` via buildStackedTrend()
- org-project-detail.component.ts: corrected the class doc comment — the
  Projects table and Influence Summary cards are not yet wired to this route;
  only the Org Overview Foundations & Projects table is

Resolves 3 review threads.

Signed-off-by: daniel qualls <dqualls@linuxfoundation.org>
Address review comment from copilot-pull-request-reviewer[bot]:

- org-project-detail.component.ts: orgUid$ no longer filters out until
  an org is selected; falls back to 'demo-org' like the sibling
  org-projects.component.ts does, so the page renders in demo mode
  instead of hanging on the loading skeleton indefinitely.

Signed-off-by: daniel qualls <dqualls@linuxfoundation.org>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 18 out of 18 changed files in this pull request and generated 2 comments.

Address review comments from copilot-pull-request-reviewer[bot]:

- org-project-detail.component.ts: reverted the demo-org uid fallback
  added in 4b0dc69 — this page hits a real HTTP endpoint validated by
  assertOrgUid (18-char Salesforce Account.Id), so the fallback would
  reliably 400 instead of rendering. orgUid$ now waits for a real org
  uid again, matching the other HTTP-backed Org Lens pages.
- org-overview-foundations-and-projects.component.html: added an
  aria-label to the clickable project row so screen readers announce
  what activating it does, matching the pattern in
  contributors.component.html.

Signed-off-by: daniel qualls <dqualls@linuxfoundation.org>

@audigregorie audigregorie left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review Summary

Solid end-to-end delivery of the Org Lens Project Detail page: shared contracts, a clean server demo-data seam, URL-persisted tab/metric/range state, keyboard-accessible tab bar, and meaningful Playwright coverage. Prior review rounds already addressed routing, breadcrumb targets, dynamic activity column labels, and the stacked-trend "All others" aggregation.

Remaining gaps are mostly polish and consistency with newer Org Lens patterns.

Major — outside the diff

  • No-org empty state: Unlike org-contributions / org-people, this page never gates on hasCompany. When selectedAccount().uid is missing, initDetailStream() never emits and the skeleton spins indefinitely.
  • E2E coverage gaps: Tests deep-link to /org/projects/kubernetes but do not cover (a) navigation from Org Overview project rows, (b) opening an influence-card drawer, or (c) the no-company empty state.

What's done well

  • Demo data lives server-side with a thin controller/service/route trio — easy Snowflake swap later.
  • Query-param persistence for tab, metric, and range with sensible defaults stripped from the URL.
  • Side-by-side leaderboard tables with viewing-org highlight, search, and paginator.
  • Tab bar implements roving tabindex + Arrow/Home/End keyboard support.

Comment thread packages/shared/src/interfaces/org-lens-project-detail.interface.ts
Address review comments from @audigregorie:

- org-project-detail.component.ts/.html: gate the page behind a
  hasCompany empty state so it no longer loads indefinitely when no
  org is selected; removed the unused orgName computed with its
  misleading 'Acme Corp' fallback
- org-project-detail.component.html: swapped both raw <input
  pInputText> leaderboard search boxes for lfx-input-text, backed by
  a reactive FormGroup with debounced valueChanges
- org-project-detail.component.ts: replaced the innerHTML-based
  Chart.js external tooltip with safe DOM construction
  (createElement/textContent)
- org-project-detail.component.html: drawer's primary stat now falls
  back to '—' when empty, matching the card-level pattern
- org-project-detail.component.html: leaderboard detail rows now
  track by a stable content-derived key instead of $index
- org-project-detail.spec.ts: updated search selector to match the
  lfx-input-text wrapper's data-test attribute

Resolves 6 review threads; OrgLensScoreType doc comment (thread 7)
was already accurate, no code change needed.

Signed-off-by: daniel qualls <dqualls@linuxfoundation.org>
@danoqualls

Copy link
Copy Markdown
Contributor Author

Review Feedback Addressed

Commit: 15b4d5d

Changes Made

  • org-project-detail.component.ts/.html: gated the page behind a hasCompany empty state so it no longer loads indefinitely with no org selected (per @audigregorie)
  • org-project-detail.component.html: swapped both raw <input pInputText> search boxes for lfx-input-text with a reactive FormGroup + debounced valueChanges (per @audigregorie)
  • org-project-detail.component.ts: replaced the innerHTML-based Chart.js tooltip with safe DOM construction (per @audigregorie)
  • org-project-detail.component.ts: removed the unused orgName computed and its 'Acme Corp' fallback (per @audigregorie)
  • org-project-detail.component.html: drawer's primary stat now falls back to '—' when empty, matching the card-level pattern (per @audigregorie)
  • org-project-detail.component.html: leaderboard detail rows now track by a stable content-derived key instead of $index (per @audigregorie)

No Change Needed

  • org-lens-project-detail.interface.ts:39: OrgLensScoreType doc comment is already accurate — no ?score= references exist anywhere in the codebase (flagged by @audigregorie)

Threads Resolved

7 of 7 threads addressed in this iteration.

Still Open (not in scope for this round)

  • E2E coverage for navigation from Org Overview project rows, opening an influence-card drawer, and the no-company empty state was flagged in the review summary — tracking as a follow-up, not addressed in this commit.

# Conflicts:
#	packages/shared/src/constants/index.ts
Fixes the failing "Code Quality Checks" CI job on PR #1028, which
flagged formatting drift in these two files after the recent review
fixes and merge from main.

Signed-off-by: daniel qualls <dqualls@linuxfoundation.org>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 18 out of 18 changed files in this pull request and generated 2 comments.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 18 out of 18 changed files in this pull request and generated 3 comments.

Comment thread apps/lfx-one/src/server/services/org-lens-project-detail.demo-data.ts Outdated
Address review comments from copilot-pull-request-reviewer[bot]:

- org-project-detail.component.ts: corrected a stale JSDoc comment
  above rowKey() that described scroll-arrow visibility behavior
  (which actually lives in onTrackScroll()/refreshArrows()) — now
  documents what rowKey() does.
- PR description: fixed the stale Ecosystem Influence card list to
  match the shipped cards (Event Sponsorships, Meetup Attendance
  instead of the never-implemented Training Completions and Mailing
  List Posts).

Resolves 2 review threads.

Signed-off-by: daniel qualls <dqualls@linuxfoundation.org>
Address review comments from copilot-pull-request-reviewer[bot]:

- org-lens-project-detail.demo-data.ts: capitalized the leaderboard
  viewing-org fallback copy ("Your Organization") to match the title
  case already used on org-overview.component.ts and the
  org-lens-project-detail.controller.ts fallback.
- Kept ProjectDetailSeed/Caption as `interface` rather than switching
  to `type` — the repo's `@typescript-eslint/consistent-type-definitions`
  ESLint rule requires `interface` for object shapes, so the suggested
  change would fail lint. No code change needed for that finding.

Resolves 1 review thread; 2 threads addressed with an explanation.

Signed-off-by: daniel qualls <dqualls@linuxfoundation.org>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 18 out of 18 changed files in this pull request and generated 5 comments.

Comment thread apps/lfx-one/src/server/services/org-lens-project-detail.demo-data.ts Outdated
danoqualls and others added 2 commits July 3, 2026 13:11
Address review comments from copilot[bot]:

- org-project-detail.component.ts: technicalCards/ecosystemCards now
  always slice influence-card sparklines at the default 12-month
  window instead of the URL-persisted timeRange (12/24/36), matching
  the OrgLensProjectInfluenceCard.sparkline contract (fixed 12
  monthly bins). timeRange now only affects the Leaderboards tab.
- org-project-detail.component.ts: scoreColumnLabel and
  drawerTimeRangeLabel special-case range=all to render "Activity
  (All time)" / "All time" instead of "Activity (36mo)" / "Last 36
  months".
- org-lens-project-detail.demo-data.ts: extracted a `plural(n,
  singular, plural)` helper and used it to remove three nested
  ternaries in the maintainers, meeting-attendance, and board-members
  caption builders.

Resolves 5 review threads.

Signed-off-by: daniel qualls <dqualls@linuxfoundation.org>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 18 out of 18 changed files in this pull request and generated 2 comments.

Comment thread packages/shared/src/constants/org-lens-project-detail.constants.ts
Comment thread apps/lfx-one/src/server/controllers/org-lens-project-detail.controller.ts Outdated
Address review comments from copilot[bot]:

- packages/shared/src/constants/org-lens-project-detail.constants.ts: align PD_HEALTH_TAG.healthy severity to 'info' to match HEALTH_SCORE_SEVERITY.healthy on the Org Lens Projects page, so the "Healthy" badge renders the same color across both pages (per copilot[bot])
- apps/lfx-one/src/server/controllers/org-lens-project-detail.controller.ts: add assertProjectSlug validation mirroring assertFoundationSlug in org-lens-memberships.controller.ts, hardening the projectSlug path param against malformed input before the real Snowflake backend replaces the fixture lookup (per copilot[bot])

Resolves 2 review threads.

Signed-off-by: daniel qualls <dqualls@linuxfoundation.org>
@github-actions

github-actions Bot commented Jul 6, 2026

Copy link
Copy Markdown

🧹 Deployment Removed

The deployment for PR #1028 has been removed.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 18 out of 18 changed files in this pull request and generated 2 comments.

</div>
<div class="flex min-w-0 flex-col gap-0.5">
<h2 class="text-base font-semibold text-gray-900" data-testid="influence-card-detail-title">{{ card.title }}</h2>
<p class="text-sm text-gray-500">{{ drawerTimeRangeLabel() }} · {{ card.scopeLabel ?? 'All projects' }}</p>
<tr class="border-b border-gray-200 text-left text-xs font-medium text-gray-500">
<th scope="col" class="w-12 px-3 py-3">#</th>
<th scope="col" class="px-3 py-3">Organization</th>
<th scope="col" class="whitespace-nowrap px-3 py-3 text-right">{{ scoreColumnLabel() }}</th>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants